package com.liuchen.common.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 日期时间工具类
 *
 * @author Comsys-liuchen
 * @ClassName: DateTimeUtils
 * @Description:
 * @date 2015年10月15日 下午3:45:12
 */
public class DateTimeUtils {

    // 系统时间格式
    private static final String SYSTEM_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    // 简单年
    private static final String SIMPLE_YEAR = "yy";
    // 月份
    private static final String MONTH = "MM";
    // 日期格式
    private static final String DATE_FORMAT = "yyyyMMdd";
    // 当前时间字符串
    private static final String NOW_TIME = "yyyyMMddHHmmssSS";
    // 展现日期格式
    private static final String SHOW_DATE_FORMAT = "yyyy-MM-dd";
    protected static Logger log = LoggerFactory.getLogger(DateTimeUtils.class);

    /**
     * 返回简单年 2015年11月16日 Seven
     */
    public static String getSimpleYear() {
        return new SimpleDateFormat(SIMPLE_YEAR).format(new Date());
    }

    /**
     * 返回月份 2015年11月16日 Seven
     */
    public static String getMonth() {
        return new SimpleDateFormat(MONTH).format(new Date());
    }

    /**
     * 目标时间-系统格式时间 toSystem(这里用一句话描述这个方法的作用)
     * toSystem @Description: Comsys-liuchen @param @param d @param @return
     * 设定文件 @return String 返回类型 @throws
     */
    public static String toSystem(Date d) {
        return new SimpleDateFormat(SYSTEM_DATE_TIME_FORMAT).format(d);
    }

    /**
     * 获取当前日期
     *
     * @return
     */
    public static String nowToSystem() {
        return new SimpleDateFormat(SYSTEM_DATE_TIME_FORMAT).format(new Date());
    }


    // ------------------------------------------------------------------------------

    /**
     * 格式化时间字符串 changeTimeString(这里用一句话描述这个方法的作用)
     * 可选) @Title: changeTimeString @Description: Comsys-liuchen @param @param
     * time @param @return 设定文件 @return Date 返回类型 @throws
     */
    public static Date changeTimeString(String time) {
        // 系统格式 2015-12-08 10:00:00:000
        if (time.length() == 10) {
            time = time + " 00:00:00";
        } else if (time.length() == 16) {
            time = time + ":00";
        } else if (time.length() > 16) {
            time = time.substring(0, 18);
        }
        SimpleDateFormat sdf = new SimpleDateFormat(SYSTEM_DATE_TIME_FORMAT);
        try {
            return sdf.parse(time);
        } catch (ParseException e) {
            log.error(e.getMessage(), e);
        }
        return null;
    }

    /**
     * 获取当下时间点2016114625000 2016年4月11日 Seven
     */
    public static String getNow() {
        SimpleDateFormat sdf = new SimpleDateFormat(NOW_TIME);
        Date dt = new Date();
        return sdf.format(dt);

    }

    /**
     * 将字符串(20160411)转换为2016-04-11 2016年4月11日 Seven
     */
    public static String getShowDate(String date) {
        if ("".equals(date) || date == null)
            return "";
        SimpleDateFormat from = new SimpleDateFormat(DATE_FORMAT);
        SimpleDateFormat to = new SimpleDateFormat(SHOW_DATE_FORMAT);
        Date dt = null;
        try {
            dt = from.parse(date);
        } catch (ParseException e) {
            log.error(e.getMessage(), e);
            return "";
        }
        return to.format(dt);
    }

    /**
     * 将fromFormate格式的str转换为toFormate格式的字符串 2016年6月8日 Seven
     */
    public static String freeFormate(String str, String fromFormate, String toFormate) {
        if ("".equals(str) || str == null)
            return null;
        if ("".equals(fromFormate) || fromFormate == null)
            return null;
        if ("".equals(toFormate) || toFormate == null)
            return null;
        String result = null;
        Date dt = null;
        try {
            SimpleDateFormat from = new SimpleDateFormat(fromFormate);
            SimpleDateFormat to = new SimpleDateFormat(toFormate);
            dt = from.parse(str);
            result = to.format(dt);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return result;
    }

    /**
     * 获取短时间格式
     *
     * @param date
     * @return
     */
    public static String getShortDate(Date date) {
        SimpleDateFormat to = new SimpleDateFormat(SHOW_DATE_FORMAT);
        return to.format(date);
    }

    /**
     * 获取给定日期的YYYYMMDD字符串
     *
     * @param date 指定的日期
     * @return YYYYMMDD
     */
    public static String getYMD(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
        return sdf.format(date);
    }

    /**
     * 获取指定日期的前一天的YMD
     *
     * @param date 指定的日期
     * @return YYYYMMDD
     */
    public static String getYestodayYMD(Date date) {
        Date yestoday = new Date(date.getTime() - 24 * 3600 * 1000);
        return getYMD(yestoday);
    }
}